package com.example;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.security.PublicKey;
import java.util.Arrays;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 阿宾
 * Date: 2025-04-05
 * Time: 08:30
 */
@RequestMapping("/request")
@RestController //标识当前类是一个请求处理类
public class RequestController {
    @RequestMapping("hello")//标识请求路径
    public String say(){
        return "hello,Spring mvc";
    }
    @RequestMapping("/m1")
    //接收参数，需要定义一个方法
    public String method1(String name){
        return "接收的name参数："+name;
    }
    @RequestMapping("/m2")
    //接收多个参数
    public String method2(String name,int age){
        return "name:" + name + " age:" + age;
    }

    @RequestMapping("/m3")
    //传递对象
    public String method3(Student student){
        return "接收对象参数："+ student;
    }

    @RequestMapping("/m4")
    //参数重命名
    public String method4(@RequestParam(value = "name",required = false) String userName){
        return "接收的userName参数："+userName;
    }

    /**
     * 接收数组参数
     * @param array
     * @return
     */
    @RequestMapping("/m5")
    public String method5(String[] array){
        return "接收到的数组参数："+Arrays.toString(array);
    }

    /**
     * 接收集合参数
     * 需要加入注解@RequestParam，此时默认是必传参数，要修改
     * 成非必传参数，需要加入required=false
     * @param list
     * @return
     */
    @RequestMapping("/m6")
    public String method6(@RequestParam(required = false) List<String> list){
        return "接收到的集合参数："+list;
    }

    /**
     * 传递JSON数据，需要添加注解@RequestBody
     * @param student
     * @return
     */
    @RequestMapping("/m7")
    public String method7(@RequestBody Student student){
        return student.toString();
    }

    /**
     * 从URL中获得参数
     * 如果URL中的参数名和方法的形参名一样，则注解不用添加属性
     * @param id
     * @param name
     * @return
     */
    @RequestMapping("/m8/{id}/{name}")
    public String method8(@PathVariable Integer id, @PathVariable String name){
        return "接收到的路径参数id name分别为"+id+","+name;
    }

    @RequestMapping("/m9/{id}/{name}")
    public String method9(@PathVariable("id") Integer idUser, @PathVariable("name") String userName){
        return "接收到的路径参数idUser userName分别为"+idUser+","+userName;
    }
    /**
     * 上传文件
     * 需要使用注解，属性是file
     * @return
     */
    @RequestMapping("/m10")
    public String method10(@RequestPart("file") MultipartFile imgFile){
        String originalFilename = imgFile.getOriginalFilename();//返回文件的原始名，也就是在上传机器的名字
        return "接到到文件, 文件名称:"+originalFilename;
    }

    /**
     *获取Cookie方法
     * @param request 表示客服端的请求
     * @param response 表示服务器的响应
     * @return 打印Cookie信息
     */
    @RequestMapping("/m11")
    public String method11(HttpServletRequest request, HttpServletResponse response){
        //获取cookie的信息
        Cookie[] cookies = request.getCookies();
        //打印cookie信息
        StringBuilder builder = new StringBuilder();
        if(cookies != null){
            for (Cookie ck: cookies) {
                //cookie的值也是键值对，由键和值组成
                builder.append(ck.getName()+":"+ck.getValue());
            }
        }

        return "cookie信息："+builder.toString();

    }

    /**
     * 获得的是cookie的值
     * 注解中的属性是需要绑定的cookie的名称
     * 如果加上required = false，则没有匹配到对应的注解中value名的cookie，也不会报错
     * 否则如果没有匹配上就会报错。
     * @param key
     * @return
     */
    @RequestMapping("/m12")
    public String method12(@CookieValue(value = "cookie2",required = false) String key){
        return "cookie的值："+key;
    }

    /**
     * 设置Session
     * @param request
     * @return
     */
    @RequestMapping("/m13")
    public String method13(HttpServletRequest request){
        //从cookie中获取sessionID，根据session获取Session对象，如果没有获取到，则创建一个session对象
        HttpSession session = request.getSession();
        if(session != null){
            //session是键值对，由名字和值组成，setAttribute就是用来设置的
            session.setAttribute("username","张三");
        }

        /*//获取cookie的信息
        Cookie[] cookies = request.getCookies();
        //打印cookie信息
        StringBuilder builder = new StringBuilder();
        if(cookies != null){
            for (Cookie ck: cookies) {
                //cookie的值也是键值对，由键和值组成
                builder.append(ck.getName()+":"+ck.getValue());
            }
        }
        System.out.println(builder.toString());*/
        return "session 存储成功";
    }

    @RequestMapping("/m14")
    public String method14(HttpServletRequest request){
        //从cookie中获取sessionID，根据session获取Session对象
        HttpSession session = request.getSession();
        //getAttribute是返回在该session会话中具有指定名称的对象，如果没有指定名称的对象，就返回null
        //此函数是返回名称是username的值
        String username = (String) session.getAttribute("username");
        return "从session中获取的name"+username;
    }

    /**
     * 简洁获取Session,使用注解
     * 注解中的属性是需要绑定的Session的名称
     * 如果加上required = false，则没有匹配到对应的注解中value名的Session，也不会报错
     * 否则如果没有匹配上就会报错。
     * @param username
     * @return
     */
    @RequestMapping("/m15")
    public String method15(@SessionAttribute(value = "username",required = false) String username){
        return "username:"+username;
    }

    /**
     * 获取session，但是如果没有获取成功，即没有名字匹配的session对象或者没有创建session对象
     * 也不会报错
     * @param session
     * @return
     */
    @RequestMapping("/m16")
    public String method16(HttpSession session){

        String username = (String) session.getAttribute("username");
        return "username:"+ username;
    }

    /**
     * 获取header
     * @param request
     * @return
     */
    @RequestMapping("/m17")
    public String method17(HttpServletRequest request){
        //参数中写header的key
        String header = request.getHeader("User-Agent");
        return "从header中获取信息："+header;
    }

    @RequestMapping("/m18")
    public String method18(@RequestHeader("User-Agent")String userAgent){
        return "从header中获取信息，userAgent"+userAgent;
    }

}
